/**
 **************************************************************************************************************************
 * Facilities for mathematics
 **************************************************************************************************************************
 * @file RBMath.h
 **************************************************************************************************************************/


#ifndef __RBMATH_H__
#define __RBMATH_H__


/**************************************************************************************************************************
 * Includes
 **************************************************************************************************************************/
#include <RBMain/RBSystem.h> // For Rand

/**************************************************************************************************************************
 * Forward declarations
 **************************************************************************************************************************/

/**************************************************************************************************************************
 * Classes
 **************************************************************************************************************************/

namespace RBMath
{
    static const float32 RB_EPSILON     = 1.175494351e-38F;
    static const float32 RB_INFINITY    = 3.402823466e+38F;
    static const float32 RB_PI          = 3.1415926535f;
    static const uint32  UINT32_MAX      = (~(uint32)0);

    template<typename T> T Min          (T a, T b);
    template<typename T> T Max          (T a, T b);
    template<typename T> T Clamp        (T val, T min_val, T max_val);
    template<typename T> T Abs          (T a);
    template<typename T> T Sign         (T a);
    template<typename T> T FMod         (T f, T mod);
    int32                  Round        (float32 a);
    template<typename Ret, typename T> Ret Sqrt        (T f);
    template<typename Ret, typename T> Ret Tan        (T f);
    template<typename Ret, typename T> void SinCos(T f, Ret& sn, Ret& cs);

    template<typename T> T ToRadian (T f);
    template<typename T> T ToDegrees(T f);
    
    float32                RandUnit ();

    // align val on align, align must be a power of 2
    uint32                 align_above(uint32 val, uint32 align);

};

/**************************************************************************************************************************/

#include "RBMath.inl"

#endif // __RBMATH_H__
